iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

高中生也可以!利用強化學習讓機器人動起來!系列 第 14

D14:pybullet介面快捷鍵&函數總結

  • 分享至 

  • xImage
  •  

各位晚安,今天是第14天了,我打算今天介紹完pybullet。首先會向各位介紹一些新的方法,因為昨天發文完後又回去看了這兩天發的東西,發現有漏掉一些方法沒有介紹,接下來就會帶各位複習這三天我介紹的方法。今天發文前對程式做確認時發現了pybullet有一些快捷功能鍵,在介紹方法前先來介紹一些快捷功能鍵吧,如果有更多我沒發現的也歡迎告知!

快捷功能鍵

當我在撰寫今日的內容時發現按下特定的按鍵時會有特殊的效果,也算是一個意外的驚喜,那既然有發現我就來向各位介紹吧,對於一些功能的理解有可能會出錯也歡迎討論。

W鍵:場景透明化,只顯示骨架

A鍵:當場景透明化的時候再按A鍵可以顯示碰撞箱

J鍵:當場景透明化時可以切換以各部件為主的三軸座標,可以以視覺確認該link的所在位置跟以link為主的座標系,如圖所示。這是按下W鍵跟J鍵的顯示結果。

hyfxk-gg5pe.gif

G鍵:切換所有子視窗顯示/隱藏

I鍵:暫停程式執行

V鍵:切換顯示/隱藏所有物體

F1鍵:切換顯示/隱藏世界座標軸

回傳link信息

我們曾介紹過p.getBasePositionAndOrientation()這個方法,這個方法會回傳機器人的所在位置,但如果今天是要回傳特定link位置的話,我們會使用p.getLinkState(模型ID,linkIndex=link索引值)

來取得link的位置等訊息,那一樣這個回傳值由8個元素所組成,不過在這個專案中我們只會使用到第一個元素,即位置座標。

獲取鍵盤事件

如果我們今天要使用鍵盤來跟環境互動的話,我們就可以使用p.getKeyboardEvents()來取得我們所按下的按鍵,這方法會回傳以按下按鍵的key跟鍵盤狀態的value組合成的dict,所以接下來可以使用.keys()方法來取得按下按鍵的種類,不過最後要再將結果強制轉換成串列,就能得到我們所按的鍵了。具體程式如下:

def getKeyPressed():
    events = p.getKeyboardEvents()
		print(f'events:{events}') #當按下方向鍵左鍵後會print出 events:{65295: 1}
    list_key = list(events.keys())
		print(list_key)#當按下方向鍵左鍵後會print出 [65295]
    return list_key

但是鍵碼都會被轉換成unicode的形式,所以我會列出常用按鍵會回傳的值,各位可以當作參考。

空白鍵(32)

方向鍵:左(65295)、右(65296)、上(65297)、下(65298)

數字鍵:0(48)、1(49)以此類推

英文字母:A(97)其餘也是以此類推,我認為全部打出來可能版面會亂亂的,所以幫各位起個頭,剩餘的就往後推就好了。

另外狀態的值1為按住、3為按下的瞬間、4為放開,

接下來可以再進行更進一步的操作,例如當按下左鍵後可以判斷該做甚麼事,例如if 65295 in getKeyPressed():...各位可以根據需求去設定。

獲取滑鼠資訊

我們除了偵測鍵盤事件以外也可以使用p.getMouseEvents()來取得滑鼠事件,該方法回傳值為:

(事件種類,滑鼠x座標,滑鼠y座標,按鍵種類,按鍵狀態)

事件種類1為滑鼠移動事件,2為點擊事件

x,y座標應該就不用說了吧,就是滑鼠當前x,y座標(還是說了,但說了也等於沒說哈哈)

按鍵種類0為左鍵、1為中鍵(滾輪)、2為右鍵

按鍵狀態分成0為移動中、3為按下、4為放開

複習

這三天我們學了很多方法,我打算以方法(參數)的方式帶各位快速看過我們認識到的方法,並且會附上提及時的天數,如果忘記詳細資訊可以直接回去看看~

physicsClient = p.connect(p.GUI):建立虛擬環境跟物理引擎。D12

p.setGravity(x, y, z):設定重力。D12

p.setRealTimeSimulation(1):設定模擬方式,當使用到p.applyExternalForce()時不可使用這個方法。D12

p.stepSimulation():當使用到p.applyExternalForce()方法時所要設定的模擬方式。D13

p.setAdditionalSearchPath(pybullet_data.getDataPath()):搜尋模組內建的模型並新增。D12

p.loadURDF(模型路徑,初始座標,初始朝向):依照路徑匯入模型,副檔名須為.urdf。D12

p.removeBody(模型ID):刪除指定模型。D12

p.getNumJoints(模型ID):獲取模型關節數量。D12

p.getJointInfo(模型ID,關節索引值):獲取該關節資訊。D12

p.addUserDebugParameter(paramName=參數名稱字串, rangeMin=最小值, rangeMax=最大值, startValue=初始值):新增可控參數。D12

p.readUserDebugParameter(可控參數名稱):讀取可控參數的值。D12

p.setJointMotorControl2(模型ID,jointIndex=關節索引值,controlMode=p.VELOCITY_CONTROL, targetVelocity=速度值):控制方法為速度控制的關節馬達控制。D13

p.setJointMotorControl2(模型ID,jointIndex=關節索引值,controlMode=p.POSITION_CONTROL, targetPosition=位置值):控制方法為位置控制的關節馬達控制。D13

p.setJointMotorControlArray(模型ID, jointIndices=所有關節索引值組合的串列,controlMode=p.VELOCITY_CONTROL,targetVelocities=各關節速度值組合的串列):控制方法為速度控制的多個關節馬達控制。D13

p.setJointMotorControlArray(模型ID, jointIndices=所有關節索引值組合的串列,controlMode=p.POSITION_CONTROL,targetPositions=各關節速度值組合的串列):控制方法為位置控制的多個關節馬達控制。D13

p.applyExternalForce(模型ID,關節索引值,[fx,fy,fz],[px,py,pz],flags):對關節直接施加作用力。D13

p.resetBasePositionAndOrientation(模型ID,生成位置,生成朝向):重新生成模型。D13

p.getEulerFromQuaternion(四元數串列):將四元數串列轉換成歐拉角度。D13

p.getBasePositionAndOrientation(模型ID):取得模型當前座標跟朝向等資訊。D13

p.getLinkState(模型ID,linkIndex=link索引值):取得模型中某link當前座標跟朝向等資訊。D14

p.resetDebugVisualizerCamera(cameraDistance=距離,cameraYaw=俯視視角,cameraPitch=水平視角,cameraTargetPosition=相機目標位置):設定上帝視角。D13

p.rayTest(raystartpos, raytopos):設定偵測用透明雷射。D13

p**.**addUserDebugLine(起始處,終止處,顏色):新增線段。D13

p.removeAllUserDebugItems():刪除所有除了模型外的物件(線段)。D13

p.getKeyboardEvents():獲取鍵盤事件。D14

p.getMouseEvents():獲取滑鼠事件。D14

結語

pybullet中還有許多實用的方法可以使用,不過因為我也沒使用過的關係就先不提了,有興趣的話可以到官方文檔中了解,文檔寫的相當淺顯易懂~連結會附於下面,這三天介紹pybullet時我也發現許多方法都忘記如何使用了,也很多方法記得如何使用但卻忘記背後的意義,經過這三天介紹我也重新複習了一遍,記憶更深刻了,真是可喜可賀。希望各位在使用上也可以順暢,雖然可能大多數人都直接使用ROS(但我目前仍然在學習當中,還是菜雞),明後天會介紹一些URDF檔案的基礎語法,在有時候需要自定義物件等的時候就可以使用,接下來就可以正式進入強化學習環境的部分了。

參考資料、網址


上一篇
D13:使用pybullet讓機器人移動
下一篇
D15:URDF語法
系列文
高中生也可以!利用強化學習讓機器人動起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言